package scheduler

import "crawlerm/engine"

type QueuedScheduler struct {
	requestChan chan engine.Request
	workerChan chan chan engine.Request
}

func (s *QueuedScheduler) WorkerChan() chan engine.Request {
	return make(chan engine.Request)
}

func (s *QueuedScheduler) Submit(r engine.Request) {
	s.requestChan<-r
}

func (s *QueuedScheduler) WorkerReady(w chan engine.Request){
	s.workerChan<-w
}

func (s *QueuedScheduler)Run(){
	s.workerChan=make(chan chan engine.Request)
	s.requestChan=make(chan engine.Request)
	go func() {
		var requestQ []engine.Request
		var workerQ []chan engine.Request
		for{
			var acviveRequest engine.Request
			var activeWorker chan engine.Request
			if len(requestQ)>0&&len(workerQ)>0 {
				activeWorker=workerQ[0]
				acviveRequest=requestQ[0]
			}
			select {
				case r:=<-s.requestChan:
					requestQ=append(requestQ,r)
				case w:=<-s.workerChan:
					workerQ=append(workerQ,w)
				case activeWorker<-acviveRequest:
						workerQ=workerQ[1:]
						requestQ=requestQ[1:]
			}

		}
	}()
}



